#ifndef ________PID_MANAGER_H_______
#define ________PID_MANAGER_H_______ 

#ifdef __cplusplus
extern "C" {
#endif 

#include "pid.h"
#include <stdint.h>
#include <stdbool.h>

// PID阶数枚举
typedef enum {
    PID_ORDER_FIRST = 1,  // 一阶PID
    PID_ORDER_SECOND = 2, // 二阶PID
    PID_ORDER_THIRD = 3   // 三阶PID
} PID_Order;

// PID初始化参数结构体
typedef struct {
    float kp;                   // 比例系数
    float ki;                   // 积分系数
    float kd;                   // 微分系数
    float max_output;           // 最大输出
    float min_output;           // 最小输出
    float max_integral;         // 最大积分
    float min_integral;         // 最小积分
    float max_derivative;       // 最大微分
    float min_derivative;       // 最小微分
    float separation_threshold; // 积分分离阈值
} PID_InitParams;

// 一阶PID结构体
typedef struct {
    PID_Type pid;   // PID控制器
    float output;   // 输出值
} FirstOrderPID;

// 二阶PID结构体
typedef struct {
    PID_Type pid1;  // 第一级PID控制器
    PID_Type pid2;  // 第二级PID控制器
    float output1;   // 第一级输出值
    float output2;   // 第二级输出值
    float final_output; // 最终输出值
} SecondOrderPID;

// 三阶PID结构体
typedef struct {
    PID_Type pid1;  // 第一级PID控制器
    PID_Type pid2;  // 第二级PID控制器
    PID_Type pid3;  // 第三级PID控制器
    float output1;   // 第一级输出值
    float output2;   // 第二级输出值
    float output3;   // 第三级输出值
    float final_output; // 最终输出值
} ThirdOrderPID;

// PID管理器结构体
typedef struct {
    PID_Order order; // PID阶数
    union {
        FirstOrderPID first_order;   // 一阶PID
        SecondOrderPID second_order; // 二阶PID
        ThirdOrderPID third_order;   // 三阶PID
    } controller;
} PID_Manager;

// 全局初始化参数数组（对应三阶PID的三个阶段）
extern PID_InitParams g_pid_init_params[3];

// 函数声明
void pid_manager_init(PID_Manager* manager, PID_Order order);
void pid_manager_set_global_params(uint8_t index, float kp, float ki, float kd,
                                  float max_output, float min_output,
                                  float max_integral, float min_integral,
                                  float max_derivative, float min_derivative,
                                  float separation_threshold);

void pid_manager_update_params(PID_Manager* manager, uint8_t stage, 
                              float kp, float ki, float kd,
                              float max_output, float min_output,
                              float max_integral, float min_integral,
                              float max_derivative, float min_derivative,
                              float separation_threshold);

float pid_manager_update(PID_Manager* manager, float setpoint, float current_value, float current_time);
float pid_manager_get_output(PID_Manager* manager, uint8_t stage);
void pid_manager_reset(PID_Manager* manager);

#ifdef __cplusplus
}
#endif


#endif // _______PID_MANAGER_H_______